package com.ck.company.service;

import com.ck.exception.ServiceException;
import com.ck.model.common.File;
import com.ck.model.common.User;
import com.ck.model.common.page.PageInfo;
import com.ck.model.company.vo.CpFileListVO;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.Map;

/**
 * 文件Service
 *
 * @author dxy
 * @date 2018/9/13 10:36
 */
public interface CpFileService {
	/**
	 * 上传文件
	 *
	 * @param files        MultipartFile
	 * @param fileType     文件类型
	 * @param companyCode  商家编码
	 * @param cloudFileDir 云文件目录
	 * @param needDuration 是否需要时长
	 * @return Map<String   ,       Object>
	 * @throws ServiceException
	 * @throws IOException
	 */
	Map<String, Object> uploadFile(MultipartFile files, Integer fileType, String companyCode, String cloudFileDir, boolean needDuration) throws ServiceException, IOException;

	/**
	 * 保存文件
	 *
	 * @param file      File
	 * @param loginUser User
	 * @param remoteIp  远程ip
	 * @throws ServiceException
	 */
	void saveFile(File file, User loginUser, String remoteIp) throws ServiceException;

	/**
	 * 通过ID修改文件
	 * @param file      File
	 * @param loginUser User
	 * @param remoteIp  远程ip
	 * @param fileType  文件类型
	 * @throws ServiceException
	 */
	void updateFileById(File file, User loginUser, String remoteIp, Integer fileType) throws ServiceException;

	/**
	 * 通过名字获取文件
	 *
	 * @param companyCode 公司编码
	 * @param fileType
	 * @param fileSuffix
	 * @param fileName    文件名称
	 * @return File
	 * @throws ServiceException
	 */
	File getFileByName(String companyCode, Integer fileType, String fileSuffix, String fileName) throws ServiceException;

	/**
	 * 获取文件列表
	 *
	 * @param companyCode 公司编码
	 * @param fileType    文件类型
	 * @param fileName    文件名
	 * @param pageNum     当前页
	 * @param pageSize    条数
	 * @return List<CpFileListDTO>
	 * @throws ServiceException
	 */
	PageInfo<CpFileListVO> listFile(String companyCode, Integer fileType, String fileName, Integer pageNum, Integer pageSize) throws ServiceException;

	/**
	 * 通过相似文件名获取文件总数
	 *
	 * @param companyCode 公司编码
	 * @param fileName    文件名称
	 * @return Long
	 */
	Long countFileLikeName(String companyCode, Integer fileType, String fileSuffix, String fileName) throws ServiceException;

	/**
	 * 重命名文件
	 *
	 * @param fileId      文件ID
	 * @param fileNewName 文件新名称
	 * @param cloudFileDir 云文件目录
	 * @return Map<String, Object>
	 */
	Map<String, Object> renameFileAndUpload(Long fileId, String fileNewName, String cloudFileDir) throws ServiceException, IOException;

	/**
	 * 通过文件ID获取文件
	 *
	 * @param fileId 文件ID
	 * @return File
	 * @throws ServiceException
	 */
	File getFileById(Long fileId) throws ServiceException;

	/**
	 * 删除文件
	 * @param fileId 文件ID
	 * @param loginUser User
	 * @param remoteIp 远程ip
	 * @throws ServiceException
	 */
	void deleteFile(Long fileId, User loginUser, String remoteIp) throws ServiceException, IOException;

	/**
	 * 通过ID删除文件
	 * @param fileId 文件ID
	 * @param loginUser User
	 * @param remoteIp 远程ip
	 */
	void deleteFileById(Long fileId, User loginUser, String remoteIp) throws ServiceException;
}
